package com.softeem.hbsm_video.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.hbsm_video.entity.Admin;
import com.softeem.hbsm_video.entity.User;
import com.softeem.hbsm_video.result.Result;
import com.softeem.hbsm_video.service.UserService;
import com.softeem.hbsm_video.vo.R;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;

import java.util.List;

import static com.softeem.hbsm_video.result.ResultCodeEnum.*;

/**
 * @author ZhouYu
 * @version 1.0
 * 用户业务接口
 */
@RestController
@RequestMapping("/user")
public class UserController {
    //todo 完成用户相关业务功能开发
    // 1. 用户注册（含加密）
    // 2. 用户登录
    // 3. 修改用户信息
    // 4. 用户列表查询
    // 5. 根据ID删除用户对象

    @Resource
    private UserService userService;

    /**
     * 用户注册（含加密）
     *
     * @param user
     * @return
     */
    @PostMapping("/register")
    private R register(@RequestBody User user) {
        //根据名称查询用户
        boolean b = userService.exists(Wrappers.query(User.class).eq("username", user.getUsername()));
        if (b) {
            //用户已存在
            return R.fail("用户已存在!").setCode(0);
        }
        //实现对密码的加密
        //生成随机盐（token）
        String salt = RandomUtil.randomString(16);
        //将输入密码和盐组合
        String pwd = user.getPassword() + salt;
        //使用md5算法对组合后的密码加密
        pwd = SecureUtil.md5(pwd);
        //将加密后的密码和随机盐设置到对象中
        user.setPassword(pwd);
        user.setSalt(salt);
        //将数据持久化到数据库
        return R.ok("用户创建成功!").setCode(1);
    }

    /**
     * 用户登录
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/login")
    private R login(@RequestParam String username, @RequestParam String password) {
        //根据用户名查询用户
        User user = userService.getOne(Wrappers.query(User.class).eq("username", username));
        if (user == null) {
            //用户不存在
            return R.fail("用户不存在!").setCode(0);
        }
        //将输入密码和盐组合
        String pwd = password + user.getSalt();
        //使用md5算法对组合后的密码加密
        pwd = SecureUtil.md5(pwd);
        if (pwd.equals(user.getPassword())) {
            //登录成功
            return R.ok("登录成功");
        } else {
            //密码错误
            return R.fail("密码错误!");
        }
    }


    /**
     * 用户列表查询
     * @return
     */
    @GetMapping("/list")
    private R list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer limit) {
        // 分页查询所有管理员 select * from admin limit ?,?
        List<User> list = userService.list(new Page<User>(page, limit));
        // 查询总记录数
        Long count = userService.count();
        return R.ok("查询成功").setData(list).setCount(count);
    }


    /**
     * 修改用户信息
     * @param user
     * @return
     */
    @PostMapping("/update")
    private R update(@RequestBody User user) {
        if (user.getId() == null) {
            return R.fail("用户不存在!");
        }
        boolean success = userService.updateById(user);
        if (success) {
            return R.ok("修改成功!");
        } else {
            return R.fail("修改失败!");
        }
    }

    /**
     * 删除用户
     * @param id
     * @return
     */
    @GetMapping("/delete")
    private R delete(Integer id) {
        //根据id查询用户
        User user = userService.getById(id);
        if (user == null) {
            //用户不存在
            return R.fail("用户不存在!").setCode(0);
        }
        //删除用户
        userService.removeById(id);
        return R.ok("用户删除成功!").setCode(1);
    }


}
